package com.note.feng.leetcode.algorithms.easy.tree;

public class ThousandTwentyTwo {
    /**
     * 1022 从根到叶的二进制数之和
     * 给出一棵二叉树，其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。
     *
     * 例如，如果路径为 0 -> 1 -> 1 -> 0 -> 1，那么它表示二进制数 01101，也就是 13 。
     * 对树上的每一片叶子，我们都要找出从根到该叶子的路径所表示的数字。
     *
     * 返回这些数字之和。题目数据保证答案是一个 32 位 整数。
     *
     * 示例 1：
     *
     * 输入：root = [1,0,1,0,1,0,1]
     * 输出：22
     * 解释：(100) + (101) + (110) + (111) = 4 + 5 + 6 + 7 = 22
     * 示例 2：
     *
     * 输入：root = [0]
     * 输出：0
     *
     * 提示：
     *
     * 树中的节点数在 [1, 1000] 范围内
     * Node.val 仅为 0 或 1 
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode.cn/problems/sum-of-root-to-leaf-binary-numbers
     */
    /**
     * 解法：遍历
     * 遍历二叉树，若节点为 null ，直接返回 0；否则 sum 需要 * 2 然后 + 节点的值；
     * 若节点没有左子树和右子树，直接返回当前 sum;
     * 递归遍历当前节点的左子树和右子树，返回他们的和。
     * @param root
     * @return
     */
    public int sumRootToLeaf(TreeNode root) {
        return dsf(root , 0);
    }

    private int dsf(TreeNode node, int sum){
        if(node == null){
            return 0;
        }
        sum = sum * 2 + node.val;
        if(node.left == null && node.right == null){
            return sum;
        }
        return dsf(node.left, sum) + dsf(node.right, sum);
    }

    public class TreeNode {
      int val;
      TreeNode left;
      TreeNode right;
      TreeNode() {}
      TreeNode(int val) { this.val = val; }
      TreeNode(int val, TreeNode left, TreeNode right) {
          this.val = val;
          this.left = left;
          this.right = right;
      }
    }
}
